package com.kukudexin.annotation;

import java.io.Serializable;
import java.util.Date;
/*
// =======================================================================================
现实中的一个实体对应着一个数据库表; 实体中的属性对应着表中的字段; 一个表对应一个Java类,表中的字段对应类中的属性
这个和数据库表对应的Java类就称为JavaBean;
JavaBenz的规范:
1.类中声明私有的属性,并且提供公开的getter/setter方法
2.类中声明公开的无参数的构造方法
3.类中要覆盖toString()方法
4.类中要覆盖hashCode()/equals()方法
5.实现Serializable接口,并且声明一个serialVersionUID(注意,这个属性使用Eclipse工具生成的)

// =======================================================================================
我们要实现的功能:根据一个JavaBenz类,自动的生成数据库的建表语句
数据库的建表语句所需要的信息
1.表名信息
2.字段的相关信息:字段名称,字段类型,字段长度,字段约束

创建表所需要的信息,在JavaBean类中携带
1.为了携带表名信息,创建一个@Table的注解 ,只在EMP类上面使用
2.为了携带字段的相关信息,创一个@Columb的注解,用在JavaBean类的属性中

开发过程小结
1.生成JavaBean类型
2.创建@Table的注解,并且在JavaBean中使用@Table的注解
3.创建@Column的注解,并且在JavaBean中使用@Column的注解
4.创建一个Main类,在方法中获取JavaBenz类中携带的注解信息,生成数据库的建表语句

// =======================================================================================
注解在开发中的作用:通过注解在类中携带信息,然后使用反射操作获取注解信息

在Java程序中携带信息的不同方式
1.通过注解在类中携带信息,然后使用反射操作获取注解信息
2.在文件中携带信息,然后使用IO方式来读取信息
*/

/**
 * @author: dexin
 * @description:
 */
@Table(tableName = "EMP1")
public class Emp implements Serializable {
    private static final long serialVersionUID = -4010938410121390048L;

    @Column(columnName = "EMPNO", columnType = "INT", columnLength = 4, columnConstraint = "PRIMARY KEY")
    private int empno;

    @Column(columnName = "ENAME", columnType = "VARCHAR", columnLength = 10)
    private String ename;

    @Column(columnName = "JOB", columnType = "VARCHAR", columnLength = 10)
    private String job;

    @Column(columnName = "HIREDATE", columnType = "DATE")
    private Date hiredate;

    public int getEmpno() {
        return empno;
    }

    public void setEmpno(int empno) {
        this.empno = empno;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Date getHiredate() {
        return hiredate;
    }

    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }

    @Override
    public String toString() {
        return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job + ", hiredate=" + hiredate + "]";
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + empno;
        result = prime * result + ((ename == null) ? 0 : ename.hashCode());
        result = prime * result + ((hiredate == null) ? 0 : hiredate.hashCode());
        result = prime * result + ((job == null) ? 0 : job.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Emp other = (Emp) obj;
        if (empno != other.empno)
            return false;
        if (ename == null) {
            if (other.ename != null)
                return false;
        } else if (!ename.equals(other.ename))
            return false;
        if (hiredate == null) {
            if (other.hiredate != null)
                return false;
        } else if (!hiredate.equals(other.hiredate))
            return false;
        if (job == null) {
            if (other.job != null)
                return false;
        } else if (!job.equals(other.job))
            return false;
        return true;
    }

    public Emp() {
        super();
    }

    public Emp(int empno, String ename, String job, Date hiredate) {
        super();
        this.empno = empno;
        this.ename = ename;
        this.job = job;
        this.hiredate = hiredate;
    }


}
